#pragma once

#include <set>
#include "Alice/ECS/Types.hpp"

namespace Alice
{

/*
    系统类需要使用到一个系统类的指针
*/
class World;

/* 
    系统基类
    用户自定义的系统需要继承自此类
    否则将不允许进行注册
*/ 
class System
{
public:
    System() : world(nullptr) {}
    
    // 此函数会在循环开始前执行一次
    virtual void Before() {}
    // 此函数会在循环时被反复调用
    virtual void OnUpdate() = 0;
    // 此函数会在循环结束后执行一次
    virtual void After() {}

    // 系统所属的世界，用来操作实体
    World* world;
    // 系统关注的实体
    std::set<Entity> entitys;
};

} // namespace Alice
